function fillZero(str = '', len) {
  const newStr = '0000' + str
  return newStr.substring(newStr.length - len, newStr.length)
}

function extractProps(d) {
  return {
    year: d.getFullYear(),
    month: d.getMonth() + 1,
    day: d.getDate(),
    hour: d.getHours(),
    minute: d.getMinutes(),
    milliseconds: d.getMilliseconds(),
  }
}

function isDateStr(str) {
  return (
    typeof str === 'string' &&
    /[0-9]{4}[-/][0-9]{1,2}[-/][0-9]{1,2}.*/.test(str)
  )
}

function isNumber(d) {
  return typeof d === 'number'
}
function isDate(d) {
  return d instanceof Date
}

/**
 * 日期时间的格式化
 * @param {String | Number | Date} d 需要转换的时间
 * @param {String} fmt 格式化字符串，如'yyyy-MM-dd hh:mm:ss'
 * @returns 格式化后的时间字符串
 */
export function formatTime(d, fmt) {
  if (!fmt) {
    console.warn('formatTime函数缺少fmt参数')
    return d
  }
  let originDate = null
  if (isDateStr(d)) {
    originDate =
      d.indexOf('T') > 0 ? new Date(d) : new Date(d.replace(/-/g, '/'))
  } else if (isDate(d)) {
    originDate = d
  } else if (isNumber(d)) {
    originDate = new Date(d)
  } else {
    return ''
  }
  const dateObj = extractProps(originDate)
  if (/yyyy/.test(fmt)) fmt = fmt.replace(/yyyy/, dateObj.year)
  if (/MM/.test(fmt)) fmt = fmt.replace(/MM/, fillZero(dateObj.month, 2))
  if (/dd/.test(fmt)) fmt = fmt.replace(/dd/, fillZero(dateObj.day, 2))
  if (/hh/.test(fmt)) fmt = fmt.replace(/hh/, fillZero(dateObj.hour, 2))
  if (/mm/.test(fmt)) fmt = fmt.replace(/mm/, fillZero(dateObj.minute, 2))
  if (/ss/.test(fmt)) fmt = fmt.replace(/ss/, fillZero(dateObj.minute, 2))
  return fmt
}
